//
// Created by LiuYou on 2020/8/8.
//

#include <iostream>

int main() {
    int integer{100};
    int& refInteger{integer};
    refInteger = 0;
    std::cout << integer << std::endl;
    std::cout << refInteger << std::endl;


    const int constInteger{4};
    /// reference to const必须要在定义引用时加上const告诉编译器引用绑定的是一个常量。所以下面语句是错误的。
//    int& refConstInteger{constInteger};
    const int& refConstInteger{constInteger};
    std::cout << constInteger << std::endl;
    std::cout << refConstInteger << std::endl;
    /// 所以无法修改值。
//    refConstInteger = 0;


///// ===================================================================================
//    /// 下面这里确实挺有意思的。常常用在函数形参中。
//    ///
//    double doubleValue{100.0};
//    /// TODO 下面这个我不知道怎么命名了。绑定的对象并不是const。但是可以const double& 。真的这个好难解释！！！！
//    const double& refDoubleValue{doubleValue};
//    std::cout << doubleValue << std::endl;
//    std::cout << refDoubleValue << std::endl;
//    /// 错误，因为refDoubleValue类型是 const double& 。
////    refDoubleValue = 0.0;
//    doubleValue = 0.0;
//    std::cout << doubleValue << std::endl;
//    std::cout << refDoubleValue << std::endl;

/// 上面为思考前，下面为思考后。 其实很简单就是使用 ref ptr作为前缀就可以了！！！！
/// ===================================================================================
    /// 下面这里确实挺有意思的。常常用在函数形参中。
    ///
    double doubleValue{100.0};
    /// TODO 下面这个我不知道怎么命名了。绑定的对象并不是const。但是可以const double& 。真的这个好难解释！！！！
    const double& refDoubleValue{doubleValue};
    std::cout << doubleValue << std::endl;
    std::cout << refDoubleValue << std::endl;
    /// 错误，因为refDoubleValue类型是 const double& 。
//    refDoubleValue = 0.0;
    doubleValue = 0.0;
    std::cout << doubleValue << std::endl;
    std::cout << refDoubleValue << std::endl;


    int speed{10000};
    const int* const constPtrToConstSpeed{&speed};
    std::cout << *constPtrToConstSpeed << std::endl;

    int integers{4};
    // TODO 一样的问题。
    const int* const constPtrToIntegers{&integers};
    std::cout << *constPtrToIntegers << std::endl;

/// ===================================================================================
    const bool constBoolean{true};
    // 错误。
//    constBoolean = false;

/// ===================================================================================
    using Integer = int;
    Integer integer1{1};
    std::cout << integer1 << std::endl;

    typedef double Double;
    Double aDouble{3.14};
    std::cout << aDouble << std::endl;

    // 这里有陷阱！！！！
    using PtrInt = int*;
    PtrInt ptrInt{&integer1};
    std::cout << *ptrInt << std::endl;

    return 0;
}